#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <string.h>
#include <syslog.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <signal.h>
#include <time.h>
void test_exit(int status, void *args)
{
    printf("before exit()\n");
    printf("exit %d\n", status);
    printf("arg=%s\n", (char *)args);
};
extern int errno;
int init_daemon(const char*pname,int facility){
     pid_t pid;
    int i;
    signal(SIGTTIN, SIG_IGN); //处理可能的终端信号
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);

    if (pid = fork())        //创建子进程，父进程退出
    {
        exit(EXIT_SUCCESS);
    }  
    else if (pid < 0)       
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    setsid();               //设置新的会话组长，新进程组长、脱离终端
    if (pid = fork())       //创建新进程，子进程不能再申请终端
    {
        exit(EXIT_SUCCESS);
    }  
    else if (pid < 0)      //关闭父进程打开的文件描述符
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }  

     for(i=0;i<NOFILE;++i)        
       close(i);
    open("/dev/null",O_RDONLY);   
    open("/dev/null",O_RDWR);   
    open("/dev/null",O_RDWR); 

    chdir("/tmp");                 ///修改主目录
    umask(0);                     ///设置文件掩码
    signal(SIGCHLD,SIG_IGN);      ///处理子进程退出   
    openlog(pname,LOG_PID,facility);  //与守护进程建立联系
    return 0; 
};
int main()
{
    // printf("the current program pid is %d\n",getpid());
    //  printf("the current program ppid is %d\n",getppid());
    // printf("the current program pgid is %d\n",getpgid(getpid()));
    // // while (1)
    // // {
    // //     /* code */
    // // }

    // int fd;
    // pid_t pid;
    // pid = fork(); // 创建新进程
    // printf("pid:%d\n", pid);
    // if (pid == 1)
    // {
    //     perror("fork");
    // }
    // else if (pid > 0)
    // {
    //     wait(NULL);
    //     exit(EXIT_FAILURE);
    // }
    // else
    // {
    //     if ((fd = open("/dev/pts/0", O_RDWR)) == -1)
    //     {
    //         perror("open");
    //     }
    // }
    // printf("pid=%d,ppid=%d\n", getpid(), getppid()); // 读取进程号与父亲进程号
    // printf("sid=%d", getsid(getpid()));              // 读取会话sid             终端sid（tcgetsid(fd)被弃用了）
    // printf("tcgetpgrp=%d\n", tcgetpgrp(fd));         // 读取终端前台进程
    // printf("getpgid=%d\n", getpgid(getpid()));       // 读取进程组id

    // pid_t pid;
    // if((pid=fork())==-1)
    // printf("fork error");
    // else if(pid == 0){
    //     printf("in the child child process\n");
    // }else{
    //     printf("in the parent process \n");
    // }

    // pid_t pid;
    // printf("before fork have enter\n");
    // printf("before fork NO enter:pid=%d\t", getpid());   //没有回车，缓存到输出流缓冲区，子用户空间将复制父亲进程的用户空间所有信息，包括这个输出流缓冲区
    // pid = fork();
    // if (pid == 0)
    // {
    //     printf("\nchild,after fork:pid=%d\n", getpid());
    // }
    // else
    // {
    //     printf("\nparent,after fork:pid=%d\n", getpid());
    // }

    // pid_t pid;
    // int fd;
    // int i = 1;
    // int status;
    // char *ch1 = "hello";
    // char *ch2 = "world";
    // char *ch3 = "IN";
    // if ((fd = open("test.txt", O_RDWR | O_CREAT, 0644)) == -1) // 打开（或者创建一个文件）
    // {
    //     perror("parent open");
    //     exit(EXIT_FAILURE);
    // }

    // if (write(fd, ch1, strlen(ch1)) == -1)
    // {
    //     perror("parent write");
    //     exit(EXIT_FAILURE);
    // }
    // if ((pid = fork()) == -1)
    // {
    //     perror("error fork");
    //     exit(EXIT_FAILURE);
    // }
    // else if (pid == 0)
    // {
    //     i = 2;
    //     printf("in child \n");
    //     printf("i=%d\n", i);
    //     if (write(fd, ch2, strlen(ch2)) == -1)
    //         perror("child write");
    //     return 0;
    // }
    // else
    // {
    //     sleep(1);
    //     printf("in parent \n");
    //     printf("i=%d\n", i);
    //     if (write(fd, ch3, strlen(ch3)) == -1)
    //         perror("parent, write");
    //     wait(&status);
    //     return 0;
    // }

    // pid_t pid;
    // if ((pid = fork()) < 0)
    // {
    //     printf("error");
    // }
    // else if (pid == 0)
    // {
    //     execl("/bin/ls", "ls", "-l", "/home", (char *)0); // 子进程中执行新的程序
    // }
    // else
    // {
    //     printf("father ok!\n");
    // }
    // char *str = "test";
    // on_exit(test_exit, (void *)str);
    // exit(4321);

    // pid_t pid_one,pid_wait;
    // int status;
    // if((pid_one=fork())==-1)
    //    perror("fork");
    // if(pid_one==0){
    //    printf("my pid is%d\n",getpid());
    //    sleep(20);
    //    exit(EXIT_SUCCESS);
    // }else{
    //    pid_wait=wait(&status);
    //    if(WIFEXITED(status)){
    //      printf("normal exit");
    //    }
    //    else if (WIFSIGNALED(status))
    //    {
    //      printf("singel exit");
    //    }

    // }

    FILE* fp;
    time_t ticks;
    init_daemon("/home/bzsg/workspace/study/linuxc/assets/text.log",LOG_KERN);
    while(1){
        sleep(1);
        ticks =time(NULL);
        syslog(LOG_INFO,"%s",asctime(localtime(&ticks))); 
    }
}
